NexusPi Git Node
lib/microReticulum/src/Reticulum.cpp v1.0.7 (59784a34) Text, 14.26 KB
Tff7b72#Tff7b72include T8b949e"Reticulum.h"
Tff7b72#Tff7b72include T8b949e"Transport.h"
Tff7b72#Tff7b72include T8b949e"Log.h"
T8b949e//#include <TransistorNoiseSource.h>
Tff7b72#Tff7b72include T8b949e<RNG.h>
Tff7b72#Tff7b72ifdef ARDUINO
Tff7b72#Tff7b72include T8b949e<Arduino.h>
T8b949e//#include <TransistorNoiseSource.h>
Tff7b72#Tff7b72endif
Tff7b72using Tff7b72namespace T7ee787RNSTb4b4b4;
Tff7b72using Tff7b72namespace T7ee787RNSTff7b72:Tff7b72:T7ee787TypeTff7b72:Tff7b72:T7ee787ReticulumTb4b4b4;
Tff7b72using Tff7b72namespace T7ee787RNSTff7b72:Tff7b72:T7ee787UtilitiesTb4b4b4;
T8b949e/*static*/ T8b949e//std::string Reticulum::_storagepath;
T8b949e/*static*/ Tffa657char Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3_storagepathTb4b4b4[Te6edf3FILEPATH_MAXSIZETb4b4b4]Tb4b4b4;
T8b949e/*static*/ T8b949e//std::string Reticulum::_cachepath;
T8b949e/*static*/ Tffa657char Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3_cachepathTb4b4b4[Te6edf3FILEPATH_MAXSIZETb4b4b4]Tb4b4b4;
T8b949e/*static*/ Tff7b72const Te6edf3ReticulumTff7b72& Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3_instance Tff7b72= Tb4b4b4{Te6edf3TypeTff7b72:Tff7b72:Te6edf3NONETb4b4b4}Tb4b4b4;
T8b949e/*static*/ Tffa657bool Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3__transport_enabled Tff7b72= Tffa657falseTb4b4b4;
T8b949e/*static*/ Tffa657bool Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3__link_mtu_discovery Tff7b72= Te6edf3RNSTff7b72:Tff7b72:Te6edf3TypeTff7b72:Tff7b72:Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3LINK_MTU_DISCOVERYTb4b4b4;
T8b949e/*static*/ Tffa657bool Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3__remote_management_enabled Tff7b72= Tffa657falseTb4b4b4;
T8b949e/*static*/ Tffa657bool Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3__use_implicit_proof Tff7b72= Tffa657trueTb4b4b4;
T8b949e/*static*/ Tffa657bool Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3__allow_probes Tff7b72= Tffa657falseTb4b4b4;
T8b949e/*static*/ Tffa657bool Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3panic_on_interface_error Tff7b72= Tffa657falseTb4b4b4;
Tff7b72#Tff7b72ifdef ARDUINO
T8b949e// Noise source to seed the random number generator.
T8b949e//TransistorNoiseSource noise(A1);
Tff7b72#Tff7b72endif
T8b949e/*
Initialises and starts a Reticulum instance. This must be
done before any other operations, and Reticulum will not
pass any traffic before being instantiated.
:param configdir: Full path to a Reticulum configuration directory.
*/
T8b949e/*p TODO
@staticmethod
void Reticulum::exit_handler():
# This exit handler is called whenever Reticulum is asked to
# shut down, and will in turn call exit handlers in other
# classes, saving necessary information to disk and carrying
# out cleanup operations.
Transport::exit_handler()
RNS.Identity.exit_handler()
@staticmethod
void Reticulum::sigint_handler(signal, frame):
Transport::detach_interfaces()
RNS.exit()
@staticmethod
void Reticulum::sigterm_handler(signal, frame):
Transport::detach_interfaces()
RNS.exit()
*/
T8b949e//def __init__(self,configdir=None, loglevel=None, logdest=None, verbosity=None):
Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3ReticulumTb4b4b4(Tb4b4b4) Tff7b72: Te6edf3_objectTb4b4b4(Tff7b72new Te6edf3ObjectTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3MEMTb4b4b4(Ta5d6ff"Ta5d6ffReticulum default object creating..., this: Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Tb4b4b4(Tffa657uintptr_tTb4b4b4)Tff7b72thisTb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff, data: Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Tb4b4b4(Tffa657uintptr_tTb4b4b4)Te6edf3_objectTb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
T8b949e// Initialize random number generator
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ffInitializing RNG...Ta5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3RNGTb4b4b4.Te6edf3beginTb4b4b4(Ta5d6ff"Ta5d6ffReticulumTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ffRNG initial random value: Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3CryptographyTff7b72:Tff7b72:Te6edf3randomnumTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifdef ARDUINO
T8b949e// Add a noise source to the list of sources known to RNG.
T8b949e//RNG.addNoiseSource(noise);
Tff7b72#Tff7b72endif
T8b949e//z RNS.vendor.platformutils.platform_checks()
T8b949e/*p TODO
if configdir != None:
Reticulum.configdir = configdir
else:
if os.path.isdir("/etc/reticulum") and os.path.isfile("/etc/reticulum/config"):
Reticulum.configdir = "/etc/reticulum"
elif os.path.isdir(Reticulum.userdir+"/.config/reticulum") and os.path.isfile(Reticulum.userdir+"/.config/reticulum/config"):
Reticulum.configdir = Reticulum.userdir+"/.config/reticulum"
else:
Reticulum.configdir = Reticulum.userdir+"/.reticulum"
if logdest == RNS.LOG_FILE:
RNS.logdest = RNS.LOG_FILE
RNS.logfile = Reticulum.configdir+"/logfile"
Reticulum.configpath = Reticulum.configdir+"/config"
Reticulum.storagepath = Reticulum.configdir+"/storage"
Reticulum.cachepath = Reticulum.configdir+"/storage/cache"
Reticulum.resourcepath = Reticulum.configdir+"/storage/resources"
Reticulum.identitypath = Reticulum.configdir+"/storage/identities"
*/
T8b949e// CBA TEST
Tff7b72#Tff7b72ifdef ARDUINO
T8b949e//_storagepath = "";
Te6edf3strncpyTb4b4b4(Te6edf3_storagepathTb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4, Te6edf3FILEPATH_MAXSIZETb4b4b4)Tb4b4b4;
T8b949e//_cachepath = "/cache";
Te6edf3strncpyTb4b4b4(Te6edf3_cachepathTb4b4b4, Ta5d6ff"Ta5d6ff/cacheTa5d6ff"Tb4b4b4, Te6edf3FILEPATH_MAXSIZETb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
T8b949e//_storagepath = ".";
Te6edf3strncpyTb4b4b4(Te6edf3_storagepathTb4b4b4, Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4, Te6edf3FILEPATH_MAXSIZETb4b4b4)Tb4b4b4;
T8b949e//_cachepath = "./cache";
Te6edf3strncpyTb4b4b4(Te6edf3_cachepathTb4b4b4, Ta5d6ff"Ta5d6ff./cacheTa5d6ff"Tb4b4b4, Te6edf3FILEPATH_MAXSIZETb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72ifdef ARDUINO
Tff7b72#Tff7b72if defined(RNS_USE_FS)
T8b949e// load time offset from file if it exists
Tff7b72try Tb4b4b4{
Tffa657char Te6edf3time_offset_pathTb4b4b4[Te6edf3FILEPATH_MAXSIZETb4b4b4]Tb4b4b4;
Te6edf3snprintfTb4b4b4(Te6edf3time_offset_pathTb4b4b4, Te6edf3FILEPATH_MAXSIZETb4b4b4, Ta5d6ff"Ta5d6ff%s/time_offsetTa5d6ff"Tb4b4b4, Te6edf3_storagepathTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3OSTff7b72:Tff7b72:Te6edf3file_existsTb4b4b4(Te6edf3time_offset_pathTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3Bytes Te6edf3bufTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3OSTff7b72:Tff7b72:Te6edf3read_fileTb4b4b4(Te6edf3time_offset_pathTb4b4b4, Te6edf3bufTb4b4b4) Tff7b72=Tff7b72= T79c0ff8Tb4b4b4) Tb4b4b4{
Tffa657uint64_t Te6edf3offset Tff7b72= Tff7b72*Tb4b4b4(Tffa657uint64_tTff7b72*Tb4b4b4)Te6edf3bufTb4b4b4.Te6edf3dataTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3DEBUGTb4b4b4(Ta5d6ff"Ta5d6ffRead time offset of Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3offsetTb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff from fileTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3OSTff7b72:Tff7b72:Te6edf3setTimeOffsetTb4b4b4(Te6edf3offsetTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72catch Tb4b4b4(Te6edf3stdTff7b72:Tff7b72:Te6edf3exceptionTff7b72& Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3ERRORFTb4b4b4(Ta5d6ff"Ta5d6ffFailed to load time offset, the contained exception was: %sTa5d6ff"Tb4b4b4, Te6edf3eTb4b4b4.Te6edf3whatTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72endif
T8b949e// Initialize time-based variables *after* time offset update
Te6edf3_objectTff7b72-Tff7b72>Te6edf3_last_data_persist Tff7b72= Te6edf3OSTff7b72:Tff7b72:Te6edf3timeTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3_objectTff7b72-Tff7b72>Te6edf3_last_cache_clean Tff7b72= T79c0ff0.0Tb4b4b4;
Te6edf3_objectTff7b72-Tff7b72>Te6edf3_jobs_last_run Tff7b72= Te6edf3OSTff7b72:Tff7b72:Te6edf3timeTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e/*p TODO
if not os.path.isdir(Reticulum.storagepath):
os.makedirs(Reticulum.storagepath)
if not os.path.isdir(Reticulum.cachepath):
os.makedirs(Reticulum.cachepath)
if not os.path.isdir(Reticulum.resourcepath):
os.makedirs(Reticulum.resourcepath)
if not os.path.isdir(Reticulum.identitypath):
os.makedirs(Reticulum.identitypath)
if os.path.isfile(self.configpath):
try:
self.config = ConfigObj(self.configpath)
except Exception as e:
RNS.log("Could not parse the configuration at "+self.configpath, RNS.LOG_ERROR)
RNS.log("Check your configuration file for errors!", RNS.LOG_ERROR)
RNS.panic()
else:
RNS.log("Could not load config file, creating default configuration file...")
self.__create_default_config()
RNS.log("Default config file created. Make any necessary changes in "+Reticulum.configdir+"/config and restart Reticulum if needed.")
time.sleep(1.5)
self.__apply_config()
RNS.log("Configuration loaded from "+self.configpath, RNS.LOG_VERBOSE)
RNS.Identity.load_known_destinations()
*/
T8b949e// CBA Moved to start() so Transport is not started until after interfaces are setup
T8b949e//Transport::start(*this);
T8b949e/*p TODO
self.rpc_addr = ("127.0.0.1", self.local_control_port)
self.rpc_key = RNS.Identity.full_hash(Transport::identity.get_private_key())
if self.is_shared_instance:
self.rpc_listener = multiprocessing.connection.Listener(self.rpc_addr, authkey=self.rpc_key)
thread = threading.Thread(target=self.rpc_loop)
thread.daemon = True
thread.start()
atexit.register(Reticulum.exit_handler)
signal.signal(signal.SIGINT, Reticulum.sigint_handler)
signal.signal(signal.SIGTERM, Reticulum.sigterm_handler)
*/
Te6edf3MEMTb4b4b4(Ta5d6ff"Ta5d6ffReticulum default object created, this: Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Tb4b4b4(Tffa657uintptr_tTb4b4b4)Tff7b72thisTb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff, data: Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Tb4b4b4(Tffa657uintptr_tTb4b4b4)Te6edf3_objectTb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3startTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3INFOTb4b4b4(Ta5d6ff"Ta5d6ffTotal memory: Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3OSTff7b72:Tff7b72:Te6edf3heap_sizeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3INFOTb4b4b4(Ta5d6ff"Ta5d6ffTotal flash: Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3OSTff7b72:Tff7b72:Te6edf3storage_sizeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3INFOTb4b4b4(Ta5d6ff"Ta5d6ffStarting Transport...Ta5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3TransportTff7b72:Tff7b72:Te6edf3startTb4b4b4(Tff7b72*Tff7b72thisTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3loopTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3assertTb4b4b4(Te6edf3_objectTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3_objectTff7b72-Tff7b72>Te6edf3_is_connected_to_shared_instanceTb4b4b4) Tb4b4b4{
T8b949e// Perform Reticulum housekeeping
Tff7b72if Tb4b4b4(Te6edf3OSTff7b72:Tff7b72:Te6edf3timeTb4b4b4(Tb4b4b4) Tff7b72> Tb4b4b4(Te6edf3_objectTff7b72-Tff7b72>Te6edf3_jobs_last_run Tff7b72+ Te6edf3JOB_INTERVALTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3jobsTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3_objectTff7b72-Tff7b72>Te6edf3_jobs_last_run Tff7b72= Te6edf3OSTff7b72:Tff7b72:Te6edf3timeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// Perform interface processing
Tff7b72for Tb4b4b4(Tff7b72autoTff7b72& Tb4b4b4[Te6edf3hashTb4b4b4, Te6edf3interfaceTb4b4b4] Tff7b72: Te6edf3TransportTff7b72:Tff7b72:Te6edf3get_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3interfaceTb4b4b4.Te6edf3loopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// Perform Filesystem processing
Te6edf3FileSystemTff7b72& Te6edf3filesystem Tff7b72= Te6edf3OSTff7b72:Tff7b72:Te6edf3get_filesystemTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3filesystemTb4b4b4) Tb4b4b4{
Te6edf3filesystemTb4b4b4.Te6edf3loopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// Perform Transport processing
Te6edf3RNSTff7b72:Tff7b72:Te6edf3TransportTff7b72:Tff7b72:Te6edf3loopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// Perform random number gnerator housekeeping
Te6edf3RNGTb4b4b4.Te6edf3loopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3jobsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657double Te6edf3now Tff7b72= Te6edf3OSTff7b72:Tff7b72:Te6edf3timeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72if 1
T8b949e// CBA Detect low-memory condition and reset
Tff7b72if Tb4b4b4(Te6edf3OSTff7b72:Tff7b72:Te6edf3heap_sizeTb4b4b4(Tb4b4b4) Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3remaining Tff7b72= Tb4b4b4(Tffa657uint8_tTb4b4b4)Tb4b4b4(Tb4b4b4(Tffa657doubleTb4b4b4)Te6edf3OSTff7b72:Tff7b72:Te6edf3heap_availableTb4b4b4(Tb4b4b4) Tff7b72/ Tb4b4b4(Tffa657doubleTb4b4b4)Te6edf3OSTff7b72:Tff7b72:Te6edf3heap_sizeTb4b4b4(Tb4b4b4) Tff7b72* T79c0ff100.0Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3remaining Tff7b72<Tff7b72= T79c0ff2Tb4b4b4) Tb4b4b4{
Te6edf3headTb4b4b4(Ta5d6ff"Ta5d6ffDETECTED LOW-MEMORY CONDITION (Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3remainingTb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff%), RESETTING!!!Ta5d6ff"Tb4b4b4, Te6edf3LOG_CRITICALTb4b4b4)Tb4b4b4;
Te6edf3persist_dataTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72if defined(ESP32)
Te6edf3ESPTb4b4b4.Te6edf3restartTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72elif defined(ARDUINO_ARCH_NRF52) || defined(ARDUINO_NRF52_ADAFRUIT)
T8b949e//dbgDumpMemory();
Te6edf3NVIC_SystemResetTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72if Tb4b4b4(Te6edf3now Tff7b72> Te6edf3_objectTff7b72-Tff7b72>Te6edf3_last_cache_clean Tff7b72+ Te6edf3CLEAN_INTERVALTb4b4b4) Tb4b4b4{
Te6edf3clean_cachesTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3_objectTff7b72-Tff7b72>Te6edf3_last_cache_clean Tff7b72= Te6edf3OSTff7b72:Tff7b72:Te6edf3timeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3now Tff7b72> Te6edf3_objectTff7b72-Tff7b72>Te6edf3_last_data_persist Tff7b72+ Te6edf3PERSIST_INTERVALTb4b4b4) Tb4b4b4{
Te6edf3persist_dataTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
T8b949e// CBA TODO
T8b949e/*
void Reticulum::start_local_interface() {
}
void Reticulum::apply_config() {
}
void Reticulum::_add_interface(self,interface, mode = None, configured_bitrate=None, ifac_size=None, ifac_netname=None, ifac_netkey=None, announce_cap=None, announce_rate_target=None, announce_rate_grace=None, announce_rate_penalty=None):
*/
Tffa657void Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3should_persist_dataTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3OSTff7b72:Tff7b72:Te6edf3timeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3_objectTff7b72-Tff7b72>Te6edf3_last_data_persist Tff7b72+ Te6edf3GRACIOUS_PERSIST_INTERVALTb4b4b4) Tb4b4b4{
Te6edf3persist_dataTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tffa657void Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3persist_dataTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ffPersisting transport and identity data...Ta5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3TransportTff7b72:Tff7b72:Te6edf3persist_dataTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3IdentityTff7b72:Tff7b72:Te6edf3persist_dataTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifdef ARDUINO
Tff7b72#Tff7b72if defined(RNS_USE_FS)
T8b949e// write time offset to file
Tff7b72try Tb4b4b4{
Tffa657char Te6edf3time_offset_pathTb4b4b4[Te6edf3FILEPATH_MAXSIZETb4b4b4]Tb4b4b4;
Te6edf3snprintfTb4b4b4(Te6edf3time_offset_pathTb4b4b4, Te6edf3FILEPATH_MAXSIZETb4b4b4, Ta5d6ff"Ta5d6ff%s/time_offsetTa5d6ff"Tb4b4b4, Te6edf3_storagepathTb4b4b4)Tb4b4b4;
Tffa657uint64_t Te6edf3offset Tff7b72= Te6edf3OSTff7b72:Tff7b72:Te6edf3ltimeTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3DEBUGFTb4b4b4(Ta5d6ff"Ta5d6ffWriting time offset of %llu to file %sTa5d6ff"Tb4b4b4, Te6edf3offsetTb4b4b4, Te6edf3time_offset_pathTb4b4b4)Tb4b4b4;
Te6edf3Bytes Td2a8ffbufTb4b4b4(Tb4b4b4(Tffa657uint8_tTff7b72*Tb4b4b4)Tff7b72&Te6edf3offsetTb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3offsetTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3OSTff7b72:Tff7b72:Te6edf3write_fileTb4b4b4(Te6edf3time_offset_pathTb4b4b4, Te6edf3bufTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72catch Tb4b4b4(Te6edf3stdTff7b72:Tff7b72:Te6edf3exceptionTff7b72& Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3ERRORFTb4b4b4(Ta5d6ff"Ta5d6ffFailed to write time offset, the contained exception was: %sTa5d6ff"Tb4b4b4, Te6edf3eTb4b4b4.Te6edf3whatTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72endif
Te6edf3_objectTff7b72-Tff7b72>Te6edf3_last_data_persist Tff7b72= Te6edf3OSTff7b72:Tff7b72:Te6edf3timeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3clean_cachesTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ffCleaning resource and packet caches...Ta5d6ff"Tb4b4b4)Tb4b4b4;
Tffa657double Te6edf3now Tff7b72= Te6edf3OSTff7b72:Tff7b72:Te6edf3timeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72if defined(RNS_USE_FS) && defined(RNS_PERSIST_PATHS)
T8b949e/*
// Clean resource caches
for (auto& filename : OS::list_directory(resourcepath) {
try {
if (filename.length() == (Type::Identity::HASHLENGTH//8)*2) {
char filepath[FILEPATH_MAXSIZE];
snprintf(filepath, FILEPATH_MAXSIZE, "%s/%s", _resourcepath, filename.c_str());
//p mtime = os.path.getmtime(filepath)
//p age = now - mtime
//p if (age > Types::Reticulum.RESOURCE_CACHE) {
//p OS::remove_file(filepath);
//p }
}
}
catch (std::exception& e) {
ERROR("Error while cleaning resources cache, the contained exception was: %s", e.what());
}
}
// Clean packet caches
for (auto& filename : OS::list_directory(_cachepath.c_str())) {
try {
if (filename.length() == (Type::Identity::HASHLENGTH/8)*2) {
char filepath[FILEPATH_MAXSIZE];
snprintf(filepath, FILEPATH_MAXSIZE, "%s/%s", _cachepath, filename.c_str());
//p mtime = os.path.getmtime(filepath)
//p age = now - mtime
//p if (age > Types::Transport::DESTINATION_TIMEOUT) {
//p OS::remove_file(filepath);
//p }
}
}
catch (std::exception& e) {
ERROR("Error while cleaning packet cache, the contained exception was: %s", e.what());
}
}
*/
Te6edf3TransportTff7b72:Tff7b72:Te6edf3clean_cachesTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// CBA
Te6edf3IdentityTff7b72:Tff7b72:Te6edf3cull_known_destinationsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}
Tffa657void Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3clear_cachesTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ffClearing resource and packet caches...Ta5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72try Tb4b4b4{
Tffa657char Te6edf3destination_table_pathTb4b4b4[Te6edf3FILEPATH_MAXSIZETb4b4b4]Tb4b4b4;
Te6edf3snprintfTb4b4b4(Te6edf3destination_table_pathTb4b4b4, Te6edf3FILEPATH_MAXSIZETb4b4b4, Ta5d6ff"Ta5d6ff%s/destination_tableTa5d6ff"Tb4b4b4, Te6edf3_storagepathTb4b4b4)Tb4b4b4;
Te6edf3OSTff7b72:Tff7b72:Te6edf3remove_fileTb4b4b4(Te6edf3destination_table_pathTb4b4b4)Tb4b4b4;
Te6edf3OSTff7b72:Tff7b72:Te6edf3remove_directoryTb4b4b4(Te6edf3_cachepathTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifdef ARDUINO
Tffa657char Te6edf3time_offset_pathTb4b4b4[Te6edf3FILEPATH_MAXSIZETb4b4b4]Tb4b4b4;
Te6edf3snprintfTb4b4b4(Te6edf3time_offset_pathTb4b4b4, Te6edf3FILEPATH_MAXSIZETb4b4b4, Ta5d6ff"Ta5d6ff%s/time_offsetTa5d6ff"Tb4b4b4, Te6edf3_storagepathTb4b4b4)Tb4b4b4;
Te6edf3OSTff7b72:Tff7b72:Te6edf3remove_fileTb4b4b4(Te6edf3time_offset_pathTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}
Tff7b72catch Tb4b4b4(Te6edf3stdTff7b72:Tff7b72:Te6edf3exceptionTff7b72& Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3ERRORFTb4b4b4(Ta5d6ff"Ta5d6ffFailed to clear cache file(s), the contained exception was: %sTa5d6ff"Tb4b4b4, Te6edf3eTb4b4b4.Te6edf3whatTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
T8b949e/*p TODO
void Reticulum::__create_default_config() {
self.config = ConfigObj(__default_rns_config__)
self.config.filename = Reticulum.configpath
if not os.path.isdir(Reticulum.configdir):
os.makedirs(Reticulum.configdir)
self.config.write()
}
void Reticulum::rpc_loop() {
}
void Reticulum::get_interface_stats() const {
}
*/
Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3BytesTb4b4b4, Te6edf3TransportTff7b72:Tff7b72:Te6edf3DestinationEntryTff7b72>Tff7b72& Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3get_path_tableTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{
T8b949e/*
path_table = []
for dst_hash in Transport::destination_table:
entry = {
"hash": dst_hash,
"timestamp": Transport::destination_table[dst_hash][0],
"via": Transport::destination_table[dst_hash][1],
"hops": Transport::destination_table[dst_hash][2],
"expires": Transport::destination_table[dst_hash][3],
"interface": str(Transport::destination_table[dst_hash][5]),
}
path_table.append(entry)
return path_table
*/
Tff7b72return Te6edf3TransportTff7b72:Tff7b72:Te6edf3get_destination_tableTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3BytesTb4b4b4, Te6edf3TransportTff7b72:Tff7b72:Te6edf3RateEntryTff7b72>Tff7b72& Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3get_rate_tableTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{
T8b949e/*
rate_table = []
for dst_hash in Transport::announce_rate_table:
entry = {
"hash": dst_hash,
"last": Transport::announce_rate_table[dst_hash]["last"],
"rate_violations": Transport::announce_rate_table[dst_hash]["rate_violations"],
"blocked_until": Transport::announce_rate_table[dst_hash]["blocked_until"],
"timestamps": Transport::announce_rate_table[dst_hash]["timestamps"],
}
rate_table.append(entry)
return rate_table
*/
Tff7b72return Te6edf3TransportTff7b72:Tff7b72:Te6edf3get_announce_rate_tableTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657bool Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3drop_pathTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destinationTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3TransportTff7b72:Tff7b72:Te6edf3expire_pathTb4b4b4(Te6edf3destinationTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657uint16_t Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3drop_all_viaTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3transport_hashTb4b4b4) Tb4b4b4{
Tffa657uint16_t Te6edf3dropped_count Tff7b72= T79c0ff0Tb4b4b4;
T8b949e//for (auto& destination_hash : Transport::get_destination_table()) {
Tff7b72for Tb4b4b4(Tff7b72const Tff7b72autoTff7b72& Tb4b4b4[Te6edf3destination_hashTb4b4b4, Te6edf3destination_entryTb4b4b4] Tff7b72: Te6edf3TransportTff7b72:Tff7b72:Te6edf3get_destination_tableTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3destination_entryTb4b4b4.Te6edf3_received_from Tff7b72=Tff7b72= Te6edf3transport_hashTb4b4b4) Tb4b4b4{
Te6edf3TransportTff7b72:Tff7b72:Te6edf3expire_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4;
Tff7b72+Tff7b72+Te6edf3dropped_countTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3dropped_countTb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3drop_announce_queuesTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3TransportTff7b72:Tff7b72:Te6edf3drop_announce_queuesTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3string Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3get_next_hop_if_nameTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destinationTb4b4b4) Tff7b72const Tb4b4b4{
Tff7b72return Te6edf3TransportTff7b72:Tff7b72:Te6edf3next_hop_interfaceTb4b4b4(Te6edf3destinationTb4b4b4)Tb4b4b4.Te6edf3nameTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657double Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3get_first_hop_timeoutTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destinationTb4b4b4) Tff7b72const Tb4b4b4{
Tff7b72return Te6edf3TransportTff7b72:Tff7b72:Te6edf3first_hop_timeoutTb4b4b4(Te6edf3destinationTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3Bytes Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3get_next_hopTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destinationTb4b4b4) Tff7b72const Tb4b4b4{
Tff7b72return Te6edf3TransportTff7b72:Tff7b72:Te6edf3next_hopTb4b4b4(Te6edf3destinationTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657size_t Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3get_link_countTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{
Tff7b72return Te6edf3TransportTff7b72:Tff7b72:Te6edf3get_link_tableTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/*p
void Reticulum::get_packet_rssi(const Bytes& packet_hash) const {
for entry in Transport::local_client_rssi_cache:
if entry[0] == packet_hash:
return entry[1]
return None
void Reticulum::get_packet_snr(const Bytes& packet_hash) const {
for entry in Transport::local_client_snr_cache:
if entry[0] == packet_hash:
return entry[1]
return None
void Reticulum::get_packet_q(const Bytes& packet_hash) const {
for entry in Transport::local_client_q_cache:
if entry[0] == packet_hash:
return entry[1]
return None
*/
Served by rngit 1.4.2 - Generated in 0.03s